package user;
import book.Book;
import book.Library;
import book.PairOfUidAndBookId;
import constant.Constant;
import util.AnalyzingBorrowedBook;
import util.LibrarySingleton;
import util.ScannerSingleton;

import java.io.IOException;
import java.util.Scanner;

public class NormalUser extends User{
    private PairOfUidAndBookId[] pairOfUidAndBookIds;
    private int borrowedCount; //当前书籍的借阅量
    //最多借阅的图书数量
    private  static final  int BORROW_BOOK_MAX_NUM=5;
    private final AnalyzingBorrowedBook analyzingBorrowedBook=new AnalyzingBorrowedBook();
    private Scanner scanner;
    public Library library;

    public NormalUser(String name, int useID){
        super(name,useID,"普通用户");
        loadBorrowedBook();
        scanner= ScannerSingleton.getScanner();
        library= LibrarySingleton.getLibrary();
    }

    private void loadBorrowedBook() {
        PairOfUidAndBookId[] allBorrowedBook;

        //1.先加载文件当中的借阅信息
        allBorrowedBook = analyzingBorrowedBook.loadObject(Constant.BORROWED_BOOK_FILE_NAME);

        //2. 默认已借阅的图书数组大小为BORROW_BOOK_MAX_NUM，这里也可以定义到常量类
        pairOfUidAndBookIds = new PairOfUidAndBookId[Constant.BORROW_BOOK_MAX_NUM];


        //3.没有读取到已借阅的图书信息
        if (allBorrowedBook== null) {
            borrowedCount = 0;
        } else {
            //4. 查看实际读取到的数组长度是多少？ 3   ->5   10
            int allBorrowedBookLen= allBorrowedBook.length;


            //5. 如果读取到了10本书被借阅 但是当前borrowedBooks数组长度小于10
            if (allBorrowedBookLen > pairOfUidAndBookIds.length) {
                //6. 按照实际情况进行分配数组内存
                pairOfUidAndBookIds = new PairOfUidAndBookId[allBorrowedBookLen];
            }


            //7.把数据拷贝回到 已借阅图书信息的数组当中
            for (int i = 0; i < allBorrowedBookLen; i++) {
                pairOfUidAndBookIds[i] = allBorrowedBook[i];
            }

            //8.更新当前实际借阅书籍的书籍数量
            borrowedCount = allBorrowedBookLen;
        }
    }
    private void storeBorrowedBook() {
        try {
            analyzingBorrowedBook.storeObject(pairOfUidAndBookIds, Constant.BORROWED_BOOK_FILE_NAME);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    @Override
    public int display() {
        System.out.println("普通用户 " + this.getName() + " 的操作菜单:");
        System.out.println("1. 查找图书");
        System.out.println("2. 打印所有的图书");
        System.out.println("3. 退出系统");
        System.out.println("4. 借阅图书");
        System.out.println("5. 归还图书");
        System.out.println("6. 查看当前个人借阅情况");
        System.out.println("请选择你的操作：");
        return scanner.nextInt();
    }
    //借阅图书
    public void borrowBook(){
       scanner.nextLine();//作用：读取并清除缓冲区中残留的换行符或空白符，避免其干扰后续输入操作，确保程序正确获取用户输入
        System.out.println("请输入你要借阅书籍的id:");
        int bookId=scanner.nextInt();
        scanner.nextLine();//因为nextInt(),只会读取整数不会读取换行符，所以这行代码的作用和第77行代码作用一样
        //如果暑假没有书，就不能借阅
        if(library.getBookId()==0){
            System.out.println("书架没有书籍暂时不能借阅");
            return;
        }
        loadBorrowedBook();//用于加载已借阅书籍的信息
        //判断要借阅的书 是否已经被借阅过了
        Book book=library.searchBookById(bookId);
        if(book==null){
            System.out.println("没有该id相关的书籍："+bookId);
            return;
        }
        for (int i = 0; i < borrowedCount; i++) {
            PairOfUidAndBookId pairOfUidAndBookId=pairOfUidAndBookIds[i];
            if (pairOfUidAndBookId.getBookId()==book.getBookId()){ //判断要借阅的书籍Id是否与已被借阅过的书籍Id一致
                if (getUseID()==pairOfUidAndBookId.getUserId()){ //判断当前用户Id是否与已借阅过书籍有记录的用户Id一致
                    System.out.println("该书已经被你借阅过了，你的ID是："+getUseID());
                    return;
                }
                else{
                    System.out.println("该书已经被其他人借阅过了，他的ID是："+pairOfUidAndBookId.getBookId());
                    return;
                }
            }
        }
        library.borrowBook(bookId); //执行借阅书籍操作
        //封装对象写到 借阅表当中
        PairOfUidAndBookId pairOfUidAndBookId=new PairOfUidAndBookId(useID,book.getBookId());//封装当前用户ID,和要借阅的书籍ID
        pairOfUidAndBookIds[borrowedCount]=pairOfUidAndBookId;//将新的借阅记录存入数组pairOfUidAndBookIds中，位置由borrowedCount决定
        borrowedCount++;//已借阅记录次数borrowedCount自增1，为下一次记录做准备
        //储存借阅图书
        storeBorrowedBook();//将借阅信息持久化储存，保存到文件中
        System.out.println("借阅成功！");
    }

    //归还图书
    public void returnBook(){

    }
    //查看个人借阅情况
    public void viewBorrowBooks(){

    }
}

